package com.example.sup.singleton;

/**
 * @ClassName _01_Hunry
 * @Description {饿汉式}
 * @Author 智邦教育.陈超
 * @Date 10:10 上午 2024/7/29
 * @Version 1.0
 */
public class SingleTonPattern {
    public static void main(String[] args) {
        Student s1 = Student.getInstance();//new Student();
        System.out.println(s1.hashCode());
        Student s2 = Student.getInstance();//new Student();
        System.out.println(s2.hashCode());
        Student s3 = Student.getInstance();//new Student();
        System.out.println(s3.hashCode());
    }
}

/*饿汉式*/
//class Student{
//    /*2.定义静态的该类对象属性*/
//    private static Student stu = new Student();//常量池--内存只有份，静态代码属性只会加载一次
//    private Integer id;
//    private String stuName;
//    /*1.构造方式私有*/
//    private Student(){
//    }
//    /*3.提供公有的方法返回该单例*/
//    public static Student getInstance(){
//        return stu;
//    }
//}

/*懒汉式 : 线程安全问题*/
//class Student{
//    /*2.定义静态的该类对象属性*/
//    private static Student stu;//常量池
//    private Integer id;
//    private String stuName;
//    /*1.构造方式私有*/
//    private Student(){
//    }
//    /*3.提供公有的方法返回该单例*/
//    public static  Student getInstance(){
//        if(stu == null ){
//            stu = new Student();
//        }
//        return stu;
//    }
//}
/*优化版本懒汉式--double check + volatile关键字（保障禁止对象创建步骤重排序） : 解决线程安全问题--没有彻底解决*/
//在反序列化的时候无法保证单例
class Student{
    /*2.定义静态的该类对象属性*/
    private volatile static Student stu;//常量池
    private Integer id;
    private String stuName;
    /*1.构造方式私有*/
    private Student(){
        System.out.println("student对象被创建了...");
    }
    /*3.提供公有的方法返回该单例*/
    public static  Student getInstance(){
        if(stu == null ){
            synchronized (stu){
                if(stu == null ){
                    stu = new Student();
                }
            }

        }
        return stu;
    }
}
